import router from '@/router'
import store from '@/store'
import axios from 'axios'

// 导出基准地址，原因：其他地方有可能不是通过axios来发送请求的
export const baseURL = 'https://pcapi-xiaotuxian-front-devtest.itheima.net/'

// 创建一个axios实例
const instance = axios.create({
  baseURL,
  timeout: 5000
})

instance.interceptors.request.use(
  (config) => {
    //  请求拦截业务逻辑
    const { profile } = store.state.user
    if (profile.token) {
      // 携带请求头
      config.headers.Authorization = `Bearer ${profile.token}`
    }
    return config
  },
  (err) => {
    return Promise.reject(err)
  }
)

// 响应拦截业务
instance.interceptors.response.use(
  // res => res.data  请求回来的数据是json格式，包装了很多层，直接取到后台的数据
  (res) => {
    return res.data
  },
  (err) => {
    // 401状态码进入该函数，401状态码表示用户携带的token是无效的，点击购买但是还没有登录的情况
    if (err.response && err.response.status === 401) {
      //  1. 清空用户的无效信息
      store.commit('user/setUser', {})
      //  2. 跳转到用户的登录页
      //  当前路由
      //  组件里面 :  'user?a=10'  $route.path === /user  $route.fullPath === /user?a=10
      //  js模块中 :   router.currentRoute.value.fullPath  就是当前地址  router.currentRoute是响应式数据
      const fullPath = encodeURIComponent(router.currentRoute.value.fullPath)
      //  3. 跳转需要传参（当前路由地址）给登录页面(编程式路由导航)
      router.push('/login?redirectUrl=' + fullPath)
    }
    return Promise.reject(err)
  }
)

// 请求工具函数
export default (url, method, submitData) => {
  // 这个函数导出去负责发送请求
  return instance({
    url,
    method,
    // 如果是get请求 需要使用params来传递请求参数  ?a=10&b=8   query参数
    // 如果不是get请求 需要使用data来传递请求参数(请求体) 请求体传参
    // []设置一个动态的key 写js表达式 js表达式执行之后作为key
    // method参数: get Get GET  转换成小写在来判断
    [method.toLowerCase() === 'get' ? 'params' : 'data']: submitData
  })
}
